import { useQueryClient } from '@tanstack/react-query' import { useParams } from 'common' import dayjs from 'dayjs' import { ArrowRight, RefreshCw } from 'lucide-react' import { parseAsJson, useQueryState } from 'nuqs' import { useMemo, useState } from 'react' import ReportHeader from '@/components/interfaces/Reports/ReportHeader' import ReportPadding from '@/components/interfaces/Reports/ReportPadding' import { EDGE_FUNCTION_REGIONS, REPORT_DATERANGE_HELPER_LABELS, } from '@/components/interfaces/Reports/Reports.constants' import ReportStickyNav from '@/components/interfaces/Reports/ReportStickyNav' import { ReportChartV2 } from '@/components/interfaces/Reports/v2/ReportChartV2' import { numericFilterSchema, ReportsNumericFilter, } from '@/components/interfaces/Reports/v2/ReportsNumericFilter' import { ReportsSelectFilter, selectFilterSchema, } from '@/components/interfaces/Reports/v2/ReportsSelectFilter' import { LogsDatePicker } from '@/components/interfaces/Settings/Logs/Logs.DatePickers' import UpgradePrompt from '@/components/interfaces/Settings/Logs/UpgradePrompt' import DefaultLayout from '@/components/layouts/DefaultLayout' import ObservabilityLayout from '@/components/layouts/ObservabilityLayout/ObservabilityLayout' import { ButtonTooltip } from '@/components/ui/ButtonTooltip' import { ReportSettings } from '@/components/ui/Charts/ReportSettings' import { useChartHoverState } from '@/components/ui/Charts/useChartHoverState' import { ObservabilityLink } from '@/components/ui/ObservabilityLink' import { useEdgeFunctionsQuery } from '@/data/edge-functions/edge-functions-query' import { edgeFunctionReports } from '@/data/reports/v2/edge-functions.config' import { useRefreshHandler, useReportDateRange } from '@/hooks/misc/useReportDateRange' import { BASE_PATH } from '@/lib/constants' import type { NextPageWithLayout } from '@/types' const EdgeFunctionsReportV2: NextPageWithLayout = () => { return ( ) } EdgeFunctionsReportV2.getLayout = (page) => ( {page} ) export default EdgeFunctionsReportV2 const EdgeFunctionsUsage = () => { const { ref } = useParams() const { data: functions } = useEdgeFunctionsQuery({ projectRef: ref, }) const chartSyncId = `edge-functions-${ref}` useChartHoverState(chartSyncId) // Filters const [statusCodeFilter, setStatusCodeFilter] = useQueryState( 'status_code', parseAsJson(numericFilterSchema.parse) ) const [regionFilter, setRegionFilter] = useQueryState( 'region', parseAsJson(selectFilterSchema.parse) ) const [executionTimeFilter, setExecutionTimeFilter] = useQueryState( 'execution_time', parseAsJson(numericFilterSchema.parse) ) const [functionFilter, setFunctionFilter] = useQueryState( 'functions', parseAsJson(selectFilterSchema.parse) ) const { selectedDateRange, updateDateRange, datePickerValue, datePickerHelpers, showUpgradePrompt, setShowUpgradePrompt, handleDatePickerChange, } = useReportDateRange(REPORT_DATERANGE_HELPER_LABELS.LAST_60_MINUTES) const queryClient = useQueryClient() const [isRefreshing, setIsRefreshing] = useState(false) const reportConfig = useMemo(() => { return edgeFunctionReports({ projectRef: ref!, functions: functions ?? [], startDate: selectedDateRange?.period_start?.date ?? '', endDate: selectedDateRange?.period_end?.date ?? '', interval: selectedDateRange?.interval ?? 'minute', filters: { functions: functionFilter ?? [], status_code: statusCodeFilter, region: regionFilter ?? [], execution_time: executionTimeFilter, }, }) }, [ ref, functions, selectedDateRange, functionFilter, statusCodeFilter, regionFilter, executionTimeFilter, ]) const onRefreshReport = useRefreshHandler( datePickerValue, datePickerHelpers, handleDatePickerChange, async () => { if (!selectedDateRange) return setIsRefreshing(true) queryClient.invalidateQueries({ queryKey: ['projects', ref, 'report-v2'] }) setTimeout(() => setIsRefreshing(false), 1000) } ) return ( <>
} className="w-7" tooltip={{ content: { side: 'bottom', text: 'Refresh report' } }} onClick={onRefreshReport} /> {selectedDateRange && (

{dayjs(selectedDateRange.period_start.date).format('MMM D, h:mma')}

{dayjs(selectedDateRange.period_end.date).format('MMM D, h:mma')}

)}
({ label: fn.name, value: fn.id, })) ?? [] } value={functionFilter ?? []} onChange={setFunctionFilter} isLoading={isRefreshing} showSearch /> ({ value: region.key, label: (
{region.key}
{region.label} {region.key}
), }))} value={regionFilter ?? []} onChange={setRegionFilter} showSearch />
} >
{selectedDateRange && reportConfig .filter((report) => !report.hide) .map((report) => ( ))}
) }